数据介绍

systation.csv中包含的是沈阳地铁站相关线路的经纬度数据,字段介绍如下表:
变量名称 描述
station 站名
line 线路编号
line_id 站编号
gps_lon 站处于的经度
gps_lat 站处于的维度
SY-20150401.csv中提供的是一卡通刷卡数据,字段介绍如下表:
变量名称 描述
V1 卡编号
V2 刷卡日期
V3 刷卡时间
V4 刷卡站点
V5 刷卡类型
V6 票价
V7 是否优惠

题目

1.使用leaflet绘制地铁线路图,要求

  (1)图中绘制地铁线路

  (2)各站点展示进站流量(08:00:00-08:05:00间的数据),流量的大小用标记的大小表示,并且提示线路、站点、流量的具体数值。

学生注:代码中包含CSS3轮播动画,请在支持CSS3的浏览器中查看完整效果。

library(leaflet)
library(data.table)
library(lubridate)
library(tidyr)
station <- fread("systation.csv")
station$line <- as.character(station$line)
flow <- fread("SY-20150401.csv")
|--------------------------------------------------|
|==================================================|
flow <- separate(flow[V5=="地铁"&V6==0&hms(V3)>=hms("08:00:00")&hms(V3)<=hms("08:05:00"),.N,by=V4],V4,c("line","station"),sep = "号线",remove = TRUE)
names(flow)[3] <- "flow"
flow <- merge(flow,station,by=c("station","line"),all=TRUE)[order(-line)]
flow$flow[is.na(flow$flow)] <- 0
line1 <- flow[line==1][order(line_id)]
line2 <- flow[line==2][order(line_id)]
getPopupHTML <- function(s,l,f){
  return (paste("<style>
                  .leaflet-popup-content-wrapper{background:black}
                  .leaflet-popup-tip{background:black}
                  .ex-pan{
                    color:white;font-weight:bold;font-family:\"simsun\";font-size:15px;text-shadow:0px 0px 30px white;
                    height:20px;width:200px;position:relative;top:0;left:0;
                  }
                  .line{height:inherit;width:inherit;position:absolute;top:0;left:0;}
                  .block{height:30px;display:inline-block;float:left;}
                  .block-l{width:80px;}
                  .block-r{width:120px;text-align:right;}
                  @keyframes tr1{0%  {opacity:0}3%  {opacity:1}30% {opacity:1}33% {opacity:0}100%{opacity:0}}
                  @keyframes tr2{0%  {opacity:0}33% {opacity:0}36% {opacity:1}64% {opacity:1}67% {opacity:0}100%{opacity:0}}
                  @keyframes tr3{0%  {opacity:0}67% {opacity:0}70% {opacity:1}97% {opacity:1}100%{opacity:0}}
                </style>
                <div class='ex-pan'>
                  <div class='line' style='animation:tr1 7s infinite;'><div class='block block-l'>站点名称</div><div class='block block-r'>",s,"</div></div>
                  <div class='line' style='animation:tr2 7s infinite;'><div class='block block-l'>线路名称</div><div class='block block-r'>",l,"号线</div></div>
                  <div class='line' style='animation:tr3 7s infinite;'><div class='block block-l'>站点流量</div><div class='block block-r'>",f,"</div></div>
                </div>"))
}
maxflow <- max(flow$flow)
leaflet() %>% addProviderTiles("OpenStreetMap.Mapnik") %>% 
  addPolylines(lng=line1$gps_lon,lat=line1$gps_lat,color="skyblue",opacity=1) %>% 
  addPolylines(lng=line2$gps_lon,lat=line2$gps_lat,color="orange",opacity=1) %>%
  addCircleMarkers(
    lng=flow$gps_lon,lat=flow$gps_lat,radius=flow$flow/maxflow*10+5,
    color=ifelse(flow$line==1,"darkgreen","darkred"),stroke=FALSE,fillOpacity=1,
    popup=getPopupHTML(flow$station,flow$line,flow$flow)
  )
2.使用plotly绘制(17:00:00-17:05:00)出站流量最多的五个站点的出站流量(柱状图)。
library(plotly)
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale
library(data.table)
library(lubridate)
library(tidyr)
flow <- fread("SY-20150401.csv")
|--------------------------------------------------|
|==================================================|
flow <- separate(flow[V5=="地铁"&V6!=0&hms(V3)>=hms("17:00:00")&hms(V3)<=hms("17:05:00"),.N,by=V4],V4,c("line","station"),sep = "号线",remove = TRUE)[order(-N)][1:5]
maxflow <- max(flow$N)+100
minflow <- min(flow$N)-100
colv <- 1-(flow$N-minflow)/maxflow
plot_ly(x=flow$station,y=flow$N,color=I(rgb(colv,colv,colv))) %>% layout(title = "2015年4月1日 17:00:00-17:05:00 出站流量最多的五个站点的出站流量(柱状图)",
yaxis=list(title='流量'),xaxis=list(title='站点名称'))
No trace type specified:
  Based on info supplied, a 'bar' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#bar
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used`error_y.color` does not currently support multiple values.`error_x.color` does not currently support multiple values.No trace type specified:
  Based on info supplied, a 'bar' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#bar
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used`error_y.color` does not currently support multiple values.`error_x.color` does not currently support multiple values.
LS0tDQp0aXRsZTogIlLnrKzlha3mrKHlrp7orq0iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KI+aVsOaNruS7i+e7jQ0KIyMjIyNzeXN0YXRpb24uY3N25Lit5YyF5ZCr55qE5piv5rKI6Ziz5Zyw6ZOB56uZ55u45YWz57q/6Lev55qE57uP57qs5bqm5pWw5o2u77yM5a2X5q615LuL57uN5aaC5LiL6KGo77yaDQp85Y+Y6YeP5ZCN56ewfOaPj+i/sHwNCnw6LXw6LXwNCnxzdGF0aW9ufOermeWQjXwNCnxsaW5lfOe6v+i3r+e8luWPt3wNCnxsaW5lX2lkfOermee8luWPt3wNCnxncHNfbG9ufOermeWkhOS6jueahOe7j+W6pnwNCnxncHNfbGF0fOermeWkhOS6jueahOe7tOW6pnwNCg0KIyMjIyNTWS0yMDE1MDQwMS5jc3bkuK3mj5DkvpvnmoTmmK/kuIDljaHpgJrliLfljaHmlbDmja7vvIzlrZfmrrXku4vnu43lpoLkuIvooajvvJoNCnzlj5jph4/lkI3np7B85o+P6L+wfA0KfDotfDotfA0KfFYxfOWNoee8luWPt3wNCnxWMnzliLfljaHml6XmnJ98DQp8VjN85Yi35Y2h5pe26Ze0fA0KfFY0fOWIt+WNoeermeeCuXwNCnxWNXzliLfljaHnsbvlnot8DQp8VjZ856Wo5Lu3fA0KfFY3fOaYr+WQpuS8mOaDoHwNCiPpopjnm64NCiMjIyMjMS7kvb/nlKhsZWFmbGV057uY5Yi25Zyw6ZOB57q/6Lev5Zu+77yM6KaB5rGCDQomZW1zcDsmZW1zcDsoMSnlm77kuK3nu5jliLblnLDpk4Hnur/ot68NCg0KJmVtc3A7JmVtc3A7KDIp5ZCE56uZ54K55bGV56S66L+b56uZ5rWB6YeP77yIMDg6MDA6MDAtMDg6MDU6MDDpl7TnmoTmlbDmja7vvInvvIzmtYHph4/nmoTlpKflsI/nlKjmoIforrDnmoTlpKflsI/ooajnpLrvvIzlubbkuJTmj5DnpLrnur/ot6/jgIHnq5nngrnjgIHmtYHph4/nmoTlhbfkvZPmlbDlgLzjgIINCg0KPGZvbnQgY29sb3I9InJlZCI+5a2m55Sf5rOo77ya5Luj56CB5Lit5YyF5ZCrQ1NTM+i9ruaSreWKqOeUu++8jOivt+WcqOaUr+aMgUNTUzPnmoTmtY/op4jlmajkuK3mn6XnnIvlrozmlbTmlYjmnpzjgII8L2ZvbnQ+DQpgYGB7cn0NCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeSh0aWR5cikNCnN0YXRpb24gPC0gZnJlYWQoInN5c3RhdGlvbi5jc3YiKQ0Kc3RhdGlvbiRsaW5lIDwtIGFzLmNoYXJhY3RlcihzdGF0aW9uJGxpbmUpDQpmbG93IDwtIGZyZWFkKCJTWS0yMDE1MDQwMS5jc3YiKQ0KZmxvdyA8LSBzZXBhcmF0ZShmbG93W1Y1PT0i5Zyw6ZOBIiZWNj09MCZobXMoVjMpPj1obXMoIjA4OjAwOjAwIikmaG1zKFYzKTw9aG1zKCIwODowNTowMCIpLC5OLGJ5PVY0XSxWNCxjKCJsaW5lIiwic3RhdGlvbiIpLHNlcCA9ICLlj7fnur8iLHJlbW92ZSA9IFRSVUUpDQpuYW1lcyhmbG93KVszXSA8LSAiZmxvdyINCmZsb3cgPC0gbWVyZ2UoZmxvdyxzdGF0aW9uLGJ5PWMoInN0YXRpb24iLCJsaW5lIiksYWxsPVRSVUUpW29yZGVyKC1saW5lKV0NCmZsb3ckZmxvd1tpcy5uYShmbG93JGZsb3cpXSA8LSAwDQpsaW5lMSA8LSBmbG93W2xpbmU9PTFdW29yZGVyKGxpbmVfaWQpXQ0KbGluZTIgPC0gZmxvd1tsaW5lPT0yXVtvcmRlcihsaW5lX2lkKV0NCmdldFBvcHVwSFRNTCA8LSBmdW5jdGlvbihzLGwsZil7DQogIHJldHVybiAocGFzdGUoIjxzdHlsZT4NCiAgICAgICAgICAgICAgICAgIC5sZWFmbGV0LXBvcHVwLWNvbnRlbnQtd3JhcHBlcntiYWNrZ3JvdW5kOmJsYWNrfQ0KICAgICAgICAgICAgICAgICAgLmxlYWZsZXQtcG9wdXAtdGlwe2JhY2tncm91bmQ6YmxhY2t9DQogICAgICAgICAgICAgICAgICAuZXgtcGFuew0KICAgICAgICAgICAgICAgICAgICBjb2xvcjp3aGl0ZTtmb250LXdlaWdodDpib2xkO2ZvbnQtZmFtaWx5Olwic2ltc3VuXCI7Zm9udC1zaXplOjE1cHg7dGV4dC1zaGFkb3c6MHB4IDBweCAzMHB4IHdoaXRlOw0KICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MjBweDt3aWR0aDoyMDBweDtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MDtsZWZ0OjA7DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAubGluZXtoZWlnaHQ6aW5oZXJpdDt3aWR0aDppbmhlcml0O3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt9DQogICAgICAgICAgICAgICAgICAuYmxvY2t7aGVpZ2h0OjMwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxvYXQ6bGVmdDt9DQogICAgICAgICAgICAgICAgICAuYmxvY2stbHt3aWR0aDo4MHB4O30NCiAgICAgICAgICAgICAgICAgIC5ibG9jay1ye3dpZHRoOjEyMHB4O3RleHQtYWxpZ246cmlnaHQ7fQ0KICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyB0cjF7MCUgIHtvcGFjaXR5OjB9MyUgIHtvcGFjaXR5OjF9MzAlIHtvcGFjaXR5OjF9MzMlIHtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjB9fQ0KICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyB0cjJ7MCUgIHtvcGFjaXR5OjB9MzMlIHtvcGFjaXR5OjB9MzYlIHtvcGFjaXR5OjF9NjQlIHtvcGFjaXR5OjF9NjclIHtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjB9fQ0KICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyB0cjN7MCUgIHtvcGFjaXR5OjB9NjclIHtvcGFjaXR5OjB9NzAlIHtvcGFjaXR5OjF9OTclIHtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjB9fQ0KICAgICAgICAgICAgICAgIDwvc3R5bGU+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZXgtcGFuJz4NCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2xpbmUnIHN0eWxlPSdhbmltYXRpb246dHIxIDdzIGluZmluaXRlOyc+PGRpdiBjbGFzcz0nYmxvY2sgYmxvY2stbCc+56uZ54K55ZCN56ewPC9kaXY+PGRpdiBjbGFzcz0nYmxvY2sgYmxvY2stcic+IixzLCI8L2Rpdj48L2Rpdj4NCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2xpbmUnIHN0eWxlPSdhbmltYXRpb246dHIyIDdzIGluZmluaXRlOyc+PGRpdiBjbGFzcz0nYmxvY2sgYmxvY2stbCc+57q/6Lev5ZCN56ewPC9kaXY+PGRpdiBjbGFzcz0nYmxvY2sgYmxvY2stcic+IixsLCLlj7fnur88L2Rpdj48L2Rpdj4NCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2xpbmUnIHN0eWxlPSdhbmltYXRpb246dHIzIDdzIGluZmluaXRlOyc+PGRpdiBjbGFzcz0nYmxvY2sgYmxvY2stbCc+56uZ54K55rWB6YePPC9kaXY+PGRpdiBjbGFzcz0nYmxvY2sgYmxvY2stcic+IixmLCI8L2Rpdj48L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4iKSkNCn0NCm1heGZsb3cgPC0gbWF4KGZsb3ckZmxvdykNCmxlYWZsZXQoKSAlPiUgYWRkUHJvdmlkZXJUaWxlcygiT3BlblN0cmVldE1hcC5NYXBuaWsiKSAlPiUgDQogIGFkZFBvbHlsaW5lcyhsbmc9bGluZTEkZ3BzX2xvbixsYXQ9bGluZTEkZ3BzX2xhdCxjb2xvcj0ic2t5Ymx1ZSIsb3BhY2l0eT0xKSAlPiUgDQogIGFkZFBvbHlsaW5lcyhsbmc9bGluZTIkZ3BzX2xvbixsYXQ9bGluZTIkZ3BzX2xhdCxjb2xvcj0ib3JhbmdlIixvcGFjaXR5PTEpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKA0KICAgIGxuZz1mbG93JGdwc19sb24sbGF0PWZsb3ckZ3BzX2xhdCxyYWRpdXM9ZmxvdyRmbG93L21heGZsb3cqMTArNSwNCiAgICBjb2xvcj1pZmVsc2UoZmxvdyRsaW5lPT0xLCJkYXJrZ3JlZW4iLCJkYXJrcmVkIiksc3Ryb2tlPUZBTFNFLGZpbGxPcGFjaXR5PTEsDQogICAgcG9wdXA9Z2V0UG9wdXBIVE1MKGZsb3ckc3RhdGlvbixmbG93JGxpbmUsZmxvdyRmbG93KQ0KICApDQoNCmBgYA0KIyMjIyMyLuS9v+eUqHBsb3Rseee7mOWItu+8iDE3OjAwOjAwLTE3OjA1OjAw77yJ5Ye656uZ5rWB6YeP5pyA5aSa55qE5LqU5Liq56uZ54K555qE5Ye656uZ5rWB6YePKOafseeKtuWbvinjgIINCmBgYHtyfQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkodGlkeXIpDQpmbG93IDwtIGZyZWFkKCJTWS0yMDE1MDQwMS5jc3YiKQ0KZmxvdyA8LSBzZXBhcmF0ZShmbG93W1Y1PT0i5Zyw6ZOBIiZWNiE9MCZobXMoVjMpPj1obXMoIjE3OjAwOjAwIikmaG1zKFYzKTw9aG1zKCIxNzowNTowMCIpLC5OLGJ5PVY0XSxWNCxjKCJsaW5lIiwic3RhdGlvbiIpLHNlcCA9ICLlj7fnur8iLHJlbW92ZSA9IFRSVUUpW29yZGVyKC1OKV1bMTo1XQ0KbWF4ZmxvdyA8LSBtYXgoZmxvdyROKSsxMDANCm1pbmZsb3cgPC0gbWluKGZsb3ckTiktMTAwDQpjb2x2IDwtIDEtKGZsb3ckTi1taW5mbG93KS9tYXhmbG93DQpwbG90X2x5KHg9ZmxvdyRzdGF0aW9uLHk9ZmxvdyROLGNvbG9yPUkocmdiKGNvbHYsY29sdixjb2x2KSkpICU+JSBsYXlvdXQodGl0bGUgPSAiMjAxNeW5tDTmnIgx5pelIDE3OjAwOjAwLTE3OjA1OjAwIOWHuuermea1gemHj+acgOWkmueahOS6lOS4quermeeCueeahOWHuuermea1gemHjyjmn7Hnirblm74pIiwNCnlheGlzPWxpc3QodGl0bGU9J+a1gemHjycpLHhheGlzPWxpc3QodGl0bGU9J+ermeeCueWQjeensCcpKQ0KYGBgDQoNCg==